====== VFIO PASSTHROUGHT ======


{{tag>VFIO passthrought qemu}}
 ===== I) Informations:===== 

<note help>LE VFIO PASSTHROUGH consiste à décharger le pilote d'un matériel (Carte graphique , usb , souris ...) pour ensuite l'assigner à une machine virtuelle par exemple ! \\
Il existe des pré-requis , du matériel plus ou moins facile à réaliser. En cas de soucis crée un topic </note>

\\ 

====== II) Pré-Requis: ======

<note>- La Fonction **IOMMU** du Bios. (Activer le 64 bits si vous avez dans le bios) \\ 
- La Prise en compte du IOMMU par linux. \\
- Un processeur ayant la prise en charge la virtualisation. \\ 
- Deux Carte-graphiques ou 1 Apu et une Carte-graphique \\ 
- 2 Entrée vidéo sur l'écran (1 pour le linux (host) et 1 pour la Machine virtuelle (Guest) \\
- Connaitre son matériel . (Référence des 2 GPU serait bien par exemple)</note>
\\
**Voilà pour les Pré-requis**


====== III) Obtentions des Informations Matériels  ======
 
<note important>**Avant tout, il existe 2 Types d'adresse :** \\
- L'adresse de l'emplacement du matériel sur la carte-mère. \\
- L'adresse VendorID**:**DeviceID ou plus souvent appelée vendeur**:**périphérique. Celle-ci est composée en deux parties séparées par un **:**
</note>


===== Étape 1: Vérification de la prise en charge de IOMMU / Virtualisation processeur  =====
\\
<note important>**/!\ En cas d'erreur IOAPIC ou  IVRS table, il y a un Fix à appliquer dans GRUB. /!\**  \\
**Fix AMD:** OUI trouvé par moi \\
** Fix Intel**: Non Trouvé car j'ai que des processeur AMD (dexter74)</note>
\\
===  Prise en Charge de IOMMU===
<note>**dmesg | grep "AMD-Vi\|Intel VT-d"** \\
\\
AMD-Vi:** Found IOMMU** at 0000:00:00.2 cap 0x40       **<= IOMMU Trouvé** \\
AMD-Vi: **Interrupt remapping enabled**                           **<= L'interruption de l'attribution du matériel est activée (Enable)** \\
\\
L'interruption de l'assignement du matériel est activée (Enable), sans ce paramètre on ne pourra pas faire le VFIO.</note>


=== Prise en Charge de la Virtualisation === 
<note>**lscpu | grep "Virtualisation"** \\
\\
Virtualisation :      AMD-V
</note>

Tous les Pré-Requis sont bons.

===== Étape 2: Obtentions des informations  =====

<note important>**Vérifier que les cartes graphiques soient installées dans le bon ordre sur la carte-mère.** \\
**Port PCI Express 1:** Carte graphique réservée au système d'exploitation Linux. (**__HOST__**) \\
**Port PCI Express 2:** Carte graphique pour le système d'exploitation invité . (**__GUEST__** / Windows) \\</note>

<note help>
 **Lister Tout:** \\
  lspci -v | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"
  
  Nvidia inclus:
  lspci -vv | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nvidia\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"

 </note> 
  
  

^   Slots	^  Type		^	Désignation	  ^ VendorID:DeviceID     ^ Kernel Driver	        ^ Notes		   |
|  00:14.2	| Audio device	| AMD/ATI Intel HDA |	1002:4383	 	| snd_hda_intel	| Carte-mère	   |
|  01:00.0	| VGA (GPU)	| GTX-260		  | 	10de:05e2		| nouveau		        | Linux (HOTE)	   |
|  02:00.0	| VGA (GPU	| R9-270x (Video)	  | 	1002:6810		| radeon		        | VFIO (GUEST) |
|  02:00.1	| Audio device	| R9-270x (HDMI)	  |	1002:aab0		| snd_hda_intel	| VFIO (GUEST) |
\\
**Ma Carte graphique est branchée en HDMI et donc les signaux Vidéo / Son ont été séparés** \\
On ne pourra pas interdire le pilote ** " snd_hda_intel" ** car il est présent sur la carte son lié à la fois à la carte-mère et à la sortie son inclus dans le HDMI. (Sortie HDMI) \\




===== Étape 3: Activation des Modules  =====

**Connaitre la marque de son processeur:**
  lscpu | grep name
 \\
 \\





**Éditer /etc/modules** (Supprimer le module kvm_XXX qui ne correspond pas à votre processeur.) \\
  pci_stub
  vfio
  vfio_iommu_type1
  vfio_pci
  kvm
  kvm_amd
  kvm_intel
=== Redémarrage du pc ===
 

**Vérification:**  \\
  lspci -v | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"


\\
^   Slots	^  Type		^	Désignation	  ^ VendorID:DeviceID     ^ Kernel Driver	        ^ Notes		  |
|  00:14.2	| Audio device	| AMD/ATI Intel HDA |	1002:4383	 	| snd_hda_intel	| Carte-mère	   |
|  01:00.0	| VGA (GPU)	| GTX-260		  | 	10de:05e2		| nouveau		        | Linux (HOTE)	   |
|  02:00.0	| VGA (GPU	| R9-270x (Video)	  | 	1002:6810		| vfio-pci		        | VFIO (GUEST) |
|  02:00.1	| Audio device	| R9-270x (HDMI)	  |	1002:aab0		| vfio-pci		        | VFIO (GUEST) |
\\
On peut voir que le "**Kernel __Driver__**" est "**vfio-pci**" . 
\\









/!\ Ignorer le "**Kernel __Modules__** /!\ 
====== VFIO ======

^   Slots	^  Type		^	Désignation	  ^ VendorID:DeviceID     ^ Kernel Driver	        ^ Notes		   |
|  00:14.2	| Audio device	| AMD/ATI Intel HDA |	1002:4383	 	| snd_hda_intel	| Carte-mère	   |
|  01:00.0	| VGA (GPU)	| GTX-260		  | 	10de:05e2		| nouveau		        | Linux (HOTE)	   |
|  02:00.0	| VGA (GPU	| R9-270x (Video)	  | 	1002:6810		| vfio-pci		        | VFIO (GUEST) |
|  02:00.1	| Audio device	| R9-270x (HDMI)	  |	1002:aab0		| vfio-pci		        | VFIO (GUEST) |


<note help>#################### **/etc/modprobe.d/vfio.conf** #################### 
   Exemple: vfio-pci ids=1002:6810,1002:aab0 
  #vfio-pci ids=<ADRESSE VendorID:DeviceID><Virgule><ADRESSE VendorID:DeviceID> 
  #Aucune Guillemet 
  #Exemple: options
</note>

<note help>#################### **/etc/vfio-pci.cfg** ####################
  Exemple: DEVICES="0000:02:00.0 0000:02:00.1"
  #Attention au Guillemet (Début et fin de toutes les adresse)
  #Chaque début d'adresse commence par __**0000:**__ (Attention au : après les 0000)
  #Un espace entre chaque adresse (sauf la première collé à la guillemet)
</note>






====== FIX IOMMU ======

**AMD:** 
<note>dmesg | grep AMD-Vi
  [0.251399] [Firmware Bug]: AMD-Vi: IOAPIC[9] not in IVRS table          <= SouthBridge Inconnus (Erreur 9) \\
  [0.251403] [Firmware Bug]: AMD-Vi: IOAPIC[10] not in IVRS table         <= Northbridge Inconnus (Erreur 10) \\
  L'erreur 9 correspond au SMBus et l'erreur 10 au IOMMU.
 </note> 


<note>lspci | grep "SMBus\|IOMMU"</note>
^ Slot    ^ Type     ^ Désignation                                                                                                            ^ Code Erreur | 
|00:00.2 | IOMMU | Advanced Micro Devices, Inc. [AMD/ATI] RD990 I/O Memory Management Unit | 10                 | 
|00:14.0 | SMBus  | Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 42)        | 9                   |
\\
^Base           ^Erreur     ^ Slot |
| ivrs_ioapic  |  [10]=      |  00:00.2    | 
| ivrs_ioapic  |  [9]=        |  00:14.0    | 
 \\
**Ce qui donne : ivrs_ioapic[9]=00:14.0 ivrs_ioapic[10]=00:00.2**



**Éditer /etc/default/grub** (Modifier la ligne selon votre cas) \\
Avant:  \\
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 
Après : \\
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ivrs_ioapic[9]=00:14.0 ivrs_ioapic[10]=00:00.2"
 \\
Ensuite faire un :
  update-grub 
\\
Redémarrer
\\
  
====== Vérification Finale ======
\\
**dmesg | grep "Found IOMMU\|remapping\|vfio"**
    [    1.597597] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
    [    1.597598] AMD-Vi: Interrupt remapping enabled   
    [    1.597712] AMD-Vi: Lazy IO/TLB flushing enabled
    
    <Manque quelque infos de ma part !   
\\

====== Script VFIO avec Qemu (Samba & Synergy) ======

Script qemu (Samba / Synergy)
  http://pastebin.com/1uxiBfx6

\\

Fix Synergy: (Bouton Suivant / Précédent / touch alt+gr)

Éditer le fichier synergy.conf
  Dans la section "screens" de la machine virtuelle ajouter en bas.
  altgr = alt
  Dans la section "options" de la machine virtuelle ajouter en bas.
  mousebutton(6) = keystroke(WWWBack)
  mousebutton(7) = keystroke(WWWForward)		




